PROFDINFO.COM

Votre enseignant d'informatique en ligne

Section 5 - SElinux

Retour à la page du cours

Voici un résumé de la présentation faite en classe sur SElinux. Le format est moins travaillé que pour les chapitres précédents, mais ça vous fera tout de même une base que vous pourrez compléter avec vos notes personnelles et vos souvenirs!

Intro

Security-Enhanced Linux est une couche de sécurité de type MAC (Mandatory Access Control - contrôle d'accès obligatoire) imbriquée dans le noyau qui vérifie les opérations permises après les vérifications standards de type DAC (Discretionary Access Control - contrôle d'accès discrétionnaire) (les rwx). Discrétionnaire = l'usager gère sa sécurité.
Obligatoire = le système gère la sécurité et impose ses règles à l'usager.

Tous les fichiers et répertoires sont appelés des objets. Les processus sont appelés des sujets. Dans un système DAC, le système contrôle les accès que les sujets ont sur les objets et comment les sujets interagissent entre eux. Les usagers contrôlent les permissions de leurs objets.

Lacunes:

Avec SElinux:

Fonctionnement

L'option -Z a été ajoutée à plusieurs commandes pour lui donner des tâches relatives à SElinux.

Pour vVérifier que selinux roule: sestatus

Fichiers:
ls -Z

Par exemple: unconfined_u:object_r:user_home_t:s0

Signification: user:role:type:level

- User: par défaut: unconfined_u
(il existe system_u pour les users système)
- Pour voir les users: /usr/sbin/semanage login -l

- Role: Les usagers sont autorisés pour un rôle et les rôles sont autorisés pour des domaines.
Intermédiaire entre usager et domaine. Ultimement: le domaine définit quels types d'objets peuvent être accédés.

- Type: domaine pour processus, type pour fichier.

- Niveau: syntaxe bâtarde:
plage: bas-haut
ou juste bas (si pas de plage)
bas et haut s'écrivent: sensibilité:catégories
catégories (optionnelles) s'écrivent comme une plage: c0.c1023
Sur un système par défaut, les niveaux sont s0 et s0:c0.c1023, donc on a la plage s0-s0:c0.c1023

Processus:
ps -eZ

Encore une fois: user:role:type:level.
system_r est un rôle pour les processus système (daemons). Le type sépare ensuite les domaines.

ex: passwd est de type passwd_t, rôle unconfined_r.

Transitions de domaines:
- Un processus d'un domaine peut transiter vers un autre domaine en exécutant une application qui a un type "point d'entrée" (entrypoint) pour le nouveau domaine.
- Ex: passwd. L'application passwd est de type passwd_exec_t (voir ls -Z /usr/bin/passwd) Elle accède à /etc/shadow, de type shadow_t.
Une règle SElinux dit qu'un processus dans le domaine passwd_t peut lire et écrire un fichier shadow_t.
Une règle dit que le domaine passwd_t donne un point d'entrée aux applications de type passwd_exec_t.

- On peut entrer dans passwd_t seulement avec une application de type passwd_exec_t.
- Cette application ne peut qu'exécuter des librairies permises (lib_t) et ne peut pas démarrer d'autres applications
- Seul passwd_t peut écrire dans shadow_t.
- passwd_t ne peut écrire que dans shadow_t et etc_t.

Users:
id -Z

Confinement

- Presque tous les services qui écoutent sur un réseau sont confinés.
- La plupart des processus qui roulent en tant que root et qui exécutent des tâches pour les usagers sont confinés (comme passwd).
- Si un processus est confiné, il roule dans son propre domaine (httpd dans httpd_t).

- Les processus non confinés roulent dans leur domaine mais des règles leur permettent d'accéder pratiquement à tout. initrc_t (init), kernel_t (kernel), unconfined_t (usagers non confinés) sont des domaines non confinés.
- un processus non confiné n'utilise que les règles DAC.

- Chaque usager est mappé vers un usager SElinux, ce qui leur donne des restrictions.
Encore une fois, on peut voir le mapping: /usr/sbin/semanage login -l
- Par défaut, les usagers sont mappés vers __default__ ce qui les envoie vers unconfined_u.
- Une application transitant de unconfined_t vers un domaine confiné reste confinée. Ça ne protège pas le système contre l'usager, mais l'usager et le système sont protégés contre l'application.

Les domaines confinés:

Logging

- /var/log/audit/audit.log
- possiblement /var/log/messages

selon les daemons (auditd et rsyslogd) qui roulent.

Config principale

Très simple: /etc/selinux/config
- SELINUX=enforcing (ou permissive (logue mais permet tout) ou disabled)
- SELINUXTYPE=targeted (seul les processus ciblés sont restreints, ce qui fait amplement l'affaire)

Switch on/off

/usr/sbin/setenforce 1 (enforcing) ou 0 (permissive) - non permanent (voir fichier ci-haut)
/usr/sbin/getenforce

Booléennes

Variables qui peuvent allumer/éteindre certaines règles au runtime.

- Lister: /usr/sbin/semanage boolean -l
ou getsebool -a (mais pas de description)
ou getsebool variable
ou getsebool var1 var2 var3...

- Configurer: setsebool [-P] var x (ou x = on/off ou 1/0) -P = permanent
ex: setsebool -P httpd_can_network_connect_db on

Étiquettes sur les fichiers - les contextes

- Lister: ls -Z

- Changer (temporaire): chcon [-R] -t type fichier - -R = récursif sur un dir
ex: touch file
ls -Z
chcon -t samba_share_t file

- Restorer: /sbin/restorecon -v file (-v = verbose)
- truc: tout est gardé dans /etc/selinux/targeted/contexts/files/filecontexts
ou filecontexts.local pour nouveau fichiers/dir

- Changer (permanent): changer lesdits fichiers avec semanage
touch /etc/file
ls -Z (etc_t)
/usr/sbin/semanage fcontext -a -t samba_share_t /etc/file (-a = add) (donner un chemin absolu pour le fichier)
(voir fichier filecontexts.local)
/sbin/restorecon -v /etc/file

- Enlever le contexte dans le fichier: /usr/sbin/semanage fcontext -d /etc/file

- Pour un dir: même chose

- Pour un dir et son contenu: même chose sauf:
semanage fcontext -a -t samba_share_t "/etc/test/(/.*)?"
(/.*)? est une expression régulière qui veut dire avec un / et 0 à X caractères, le tout répété autant de fois que nécessaire. Bref, le dossier et ses fichiers.

- Copier, par défaut, change le contexte (un nouveau fichier est créé avec son contexte par défaut).
- On peut utiliser --preserve=context pour garder le tout.
- ou -Z user:role:type:level pour donner un nouveau contexte.

- Déplacer, par défaut, conserve le contexte. On fait attention, ce n'est pas toujours ce qui est voulu.

Confiner les users

- Nouveau: useradd -Z user_u user
semanage login -l

- Existant: semanage login -a -s user_u user (-a: add -s: selinux user) - on ajoute un mappging SElinux pour la première fois

- Existant, déjà mappé SElinux: semanage login -m -s user_u user

- Enlever un mapping: -d

- Par défaut: unconfined_u.
Pour changer le défaut: semanage login -m -S targeted -s "user_u" -r s0 __default__

Exercices

Retour à la table des matières de la section